home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / var / lib / python-support / python2.6 / invest / quotes.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-10-12  |  7.8 KB  |  221 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from os.path import join
  5. import gnomeapplet
  6. import gtk
  7. import gtk.gdk as gtk
  8. import gconf
  9. import gobject
  10. from gettext import gettext as _
  11. import csv
  12. from urllib import urlopen
  13. import datetime
  14. from threading import Thread
  15. import invest
  16. import invest.about as invest
  17. import invest.chart as invest
  18. CHUNK_SIZE = 524288
  19. AUTOREFRESH_TIMEOUT = 600000
  20. QUOTES_URL = 'http://finance.yahoo.com/d/quotes.csv?s=%(s)s&f=sl1d1t1c1ohgv&e=.csv'
  21. QUOTES_CSV_FIELDS = [
  22.     'ticker',
  23.     ('trade', float),
  24.     'time',
  25.     'date',
  26.     ('variation', float),
  27.     ('open', float)]
  28.  
  29. class _IdleObject(gobject.GObject):
  30.     '''
  31. \tOverride gobject.GObject to always emit signals in the main thread
  32. \tby emmitting on an idle handler
  33. \t'''
  34.     
  35.     def __init__(self):
  36.         gobject.GObject.__init__(self)
  37.  
  38.     
  39.     def emit(self, *args):
  40.         gobject.idle_add(gobject.GObject.emit, self, *args)
  41.  
  42.  
  43.  
  44. class QuotesRetriever(Thread, _IdleObject):
  45.     '''
  46. \tThread which uses gobject signals to return information
  47. \tto the GUI.
  48. \t'''
  49.     __gsignals__ = {
  50.         'completed': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, []) }
  51.     
  52.     def __init__(self, tickers):
  53.         Thread.__init__(self)
  54.         _IdleObject.__init__(self)
  55.         self.tickers = tickers
  56.         self.retrieved = False
  57.         self.data = []
  58.  
  59.     
  60.     def run(self):
  61.         quotes_url = QUOTES_URL % {
  62.             's': self.tickers }
  63.         
  64.         try:
  65.             quotes_file = urlopen(quotes_url, proxies = invest.PROXY)
  66.             self.data = quotes_file.readlines()
  67.             quotes_file.close()
  68.         except:
  69.             if invest.DEBUGGING:
  70.                 print 'Error while retrieving quotes data (url = %s)' % quotes_url
  71.             
  72.  
  73.         self.retrieved = True
  74.         self.emit('completed')
  75.  
  76.  
  77.  
  78. class QuoteUpdater(gtk.ListStore):
  79.     updated = False
  80.     last_updated = None
  81.     (SYMBOL, TICKER_ONLY, BALANCE, BALANCE_PCT, VALUE, VARIATION_PCT, PB) = range(7)
  82.     
  83.     def __init__(self, change_icon_callback, set_tooltip_callback):
  84.         gtk.ListStore.__init__(self, gobject.TYPE_STRING, bool, float, float, float, float, gtk.gdk.Pixbuf)
  85.         gobject.timeout_add(AUTOREFRESH_TIMEOUT, self.refresh)
  86.         self.change_icon_callback = change_icon_callback
  87.         self.set_tooltip_callback = set_tooltip_callback
  88.         self.refresh()
  89.  
  90.     
  91.     def refresh(self):
  92.         if len(invest.STOCKS) == 0:
  93.             return True
  94.         tickers = '+'.join(invest.STOCKS.keys())
  95.         quotes_retriever = QuotesRetriever(tickers)
  96.         quotes_retriever.connect('completed', self.on_retriever_completed)
  97.         quotes_retriever.start()
  98.         self.quotes_valid = False
  99.  
  100.     
  101.     def on_retriever_completed(self, retriever):
  102.         if retriever.retrieved == False:
  103.             tooltip = [
  104.                 _('Invest could not connect to Yahoo! Finance')]
  105.             if self.last_updated != None:
  106.                 tooltip.append(_('Updated at %s') % self.last_updated.strftime('%H:%M'))
  107.             
  108.             self.set_tooltip_callback('\n'.join(tooltip))
  109.         else:
  110.             self.populate(self.parse_yahoo_csv(csv.reader(retriever.data)))
  111.             self.updated = True
  112.             self.last_updated = datetime.datetime.now()
  113.             tooltip = []
  114.             if self.simple_quotes_count > 0:
  115.                 tooltip.append(_('Quotes average change %%: %+.2f%%') % self.avg_simple_quotes_change)
  116.             
  117.             if self.positions_count > 0:
  118.                 tooltip.append(_('Positions balance: %+.2f') % self.positions_balance)
  119.             
  120.             tooltip.append(_('Updated at %s') % self.last_updated.strftime('%H:%M'))
  121.             self.set_tooltip_callback('\n'.join(tooltip))
  122.  
  123.     
  124.     def parse_yahoo_csv(self, csvreader):
  125.         result = { }
  126.         for fields in csvreader:
  127.             if len(fields) == 0:
  128.                 continue
  129.             
  130.             result[fields[0]] = { }
  131.             for i, field in enumerate(QUOTES_CSV_FIELDS):
  132.                 if type(field) == tuple:
  133.                     
  134.                     try:
  135.                         result[fields[0]][field[0]] = field[1](fields[i])
  136.                     result[fields[0]][field[0]] = 0
  137.  
  138.                     continue
  139.                 result[fields[0]][field] = fields[i]
  140.             
  141.             
  142.             try:
  143.                 result[fields[0]]['variation_pct'] = (result[fields[0]]['variation'] / float(result[fields[0]]['trade'] - result[fields[0]]['variation'])) * 100
  144.             continue
  145.             except ZeroDivisionError:
  146.                 result[fields[0]]['variation_pct'] = 0
  147.                 continue
  148.             
  149.  
  150.         
  151.         return result
  152.  
  153.     
  154.     def populate(self, quotes):
  155.         self.clear()
  156.         if len(quotes) == 0:
  157.             self.quotes_valid = False
  158.             return None
  159.         self.quotes_valid = True
  160.         
  161.         try:
  162.             quote_items = quotes.items()
  163.             quote_items.sort()
  164.             simple_quotes_change = 0
  165.             self.simple_quotes_count = 0
  166.             self.positions_balance = 0
  167.             self.positions_count = 0
  168.             for ticker, val in quote_items:
  169.                 pb = None
  170.                 is_simple_quote = True
  171.                 for purchase in invest.STOCKS[ticker]:
  172.                     if purchase['amount'] != 0:
  173.                         is_simple_quote = False
  174.                         break
  175.                         continue
  176.                     len(quotes) == 0
  177.                 
  178.                 image_retriever = invest.chart.ImageRetriever(url)
  179.                 image_retriever.connect('completed', self.set_pb_callback, row)
  180.                 image_retriever.start()
  181.             
  182.             if self.simple_quotes_count > 0:
  183.                 self.avg_simple_quotes_change = simple_quotes_change / float(self.simple_quotes_count)
  184.             else:
  185.                 self.avg_simple_quotes_change = 0
  186.             if self.avg_simple_quotes_change != 0:
  187.                 simple_quotes_change_sign = self.avg_simple_quotes_change / abs(self.avg_simple_quotes_change)
  188.             else:
  189.                 simple_quotes_change_sign = 0
  190.             if self.simple_quotes_count > 0:
  191.                 self.change_icon_callback(simple_quotes_change_sign)
  192.             else:
  193.                 positions_balance_sign = self.positions_balance / abs(self.positions_balance)
  194.                 self.change_icon_callback(positions_balance_sign)
  195.         except:
  196.             len(quotes) == 0
  197.             self.quotes_valid = False
  198.  
  199.  
  200.     
  201.     def set_pb_callback(self, retriever, row):
  202.         self.set_value(row, 6, retriever.image.get_pixbuf())
  203.  
  204.     
  205.     def simple_quotes_only(self):
  206.         res = True
  207.         for entry, value in invest.STOCKS.iteritems():
  208.             for purchase in value:
  209.                 if purchase['amount'] != 0:
  210.                     res = False
  211.                     break
  212.                     continue
  213.             
  214.         
  215.         return res
  216.  
  217.  
  218. if gtk.pygtk_version < (2, 8, 0):
  219.     gobject.type_register(QuoteUpdater)
  220.  
  221.